package com.bestcem.xm.user.service;


import com.bestcem.bp.xm.user.grpc.v1.services.UserConditionLevel;
import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.component.security.dto.TokenDTO;
import com.bestcem.xm.user.controller.vo.user.request.UserInfoRequestVO;
import com.bestcem.xm.user.entity.base.PageParam;
import com.bestcem.xm.user.entity.pojo.UserDO;
import com.bestcem.xm.user.service.dto.PageRequestDTO;
import com.bestcem.xm.user.service.dto.PageResponseDTO;
import com.bestcem.xm.user.service.dto.PageUserResponseDTO;
import com.bestcem.xm.user.service.dto.role.UserRoleDTO;
import com.bestcem.xm.user.service.dto.user.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Linked <zhijian.lin@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/1 14:51
 */
public interface UserService {

    /**
     * 账号-绑定手机号-发送验证码
     *
     * @param mobile
     * @param prefix
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/6 16:55
     */
    ServiceResult<String> sendVerificationCode(String mobile, String prefix);

    /**
     * 用户确定点击版本公告
     *
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/01 16:52
     */
    ServiceResult<Boolean> clickIntroduction(String userId);

    /**
     * 用户添加引导读取记录
     *
     * @param guide  新增的读取记录版本内容
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/01 16:56
     */
    ServiceResult<Integer> addGuideRecord(String guide, String userId);

    /**
     * 指定编码
     *
     * @param value 需要被转义的字符串
     * @return java.lang.String
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/8/27 22:19
     */
    ServiceResult<String> encodeValue(String value) throws UnsupportedEncodingException;

    /**
     * 新增账号
     * 新账号属于登录账号的第一个组中-> python代码get_default_group这个方法返回的group_id没有被用到 故不写此逻辑
     * 经python确认给账号添加高级管理员角色也不需要请求create_senior_user_entry接口
     *
     * @param accountDTO: 新增账号数据
     * @param remoteHost: 调用ip
     * @param protocol:   调用协议
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 18:26
     */
    ServiceResult<String> saveUserAccount(SaveUserAccountDTO accountDTO, String remoteHost, String protocol);

    /**
     * 编辑账号
     *
     * @param accountDTO: 编辑数据
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 18:26
     */
    ServiceResult<String> updateUserAccount(UpdateUserAccountDTO accountDTO);

    /**
     * 禁用/启用账号
     *
     * @param currentToken 当前token
     * @param userId       用户id
     * @param status       状态
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.UserDetailDTO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/2 10:48
     */
    ServiceResult<UserDTO> updateUserStatus(TokenDTO currentToken, String userId, int status);

    /**
     * 可选参数查询
     *
     * @param user 查询参数
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.entity.pojo.UserDO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/23 22:38
     */
    ServiceResult<List<UserDO>> selectByOrgIdSelective(UserDTO user);

    /**
     * 账号-修改姓名/账号/邮箱(绑定或解绑)/首页
     *
     * @param currentToken token信息
     * @param userId       用户id
     * @param vo           可选参数
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/2 15:09
     */
    ServiceResult<String> updateUserInfo(TokenDTO currentToken, String userId, UserInfoRequestVO vo);

    /**
     * 解绑手机号
     *
     * @param currentToken
     * @param userId
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/2 17:25
     */
    ServiceResult<String> unbindMobileNumber(TokenDTO currentToken, String userId);

    /**
     * 新版找回密码，支持手机号和邮箱找回，
     * 1：非公司域名下（官网找回密码），则会将此手机号/邮箱下所有的密码都改了
     * 2：公司域名下，则只改当前公司的密码
     *
     * @param paramDTO 找回密码的相关参数
     * @return com.bestcem.xm.util.ServiceResult
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/02 15:21
     */
    ServiceResult<FindPasswordResultDTO> findPassword(FindPasswordParamDTO paramDTO);

    /**
     * 根据用户id查询用户信息
     *
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.grpc.client.dto.UserDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/03 17:56
     */
    ServiceResult<UserDTO> selectById(String userId);

    /**
     * 防刷检测
     * XM.web.handlers.BaseHandler.check_frequency
     *
     * @param resource
     * @param durian
     * @param limit
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/3 10:59
     */
    ServiceResult<Boolean> checkFrequency(String resource, int durian, int limit);

    /**
     * 发送绑定邮件
     *
     * @param userId
     * @param email
     * @param orgId
     * @param orgCode
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/3 10:59
     */
    ServiceResult<String> sendBandEmail(String userId, String email, String orgId, String orgCode);

    /**
     * 账号列表
     *
     * @param accountDTO: 账号列表搜索数据
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.PageResponseDTO < com.bestcem.xm.user.controller.vo.user.request.UserAccountListVO>>
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 18:26
     */
    ServiceResult<PageUserResponseDTO> getUserAccountList(ListUserAccountDTO accountDTO);

    /**
     * 下载模板
     *
     * @param path
     * @param response
     * @return
     * @author 林志剑 <zhijian.lin@idiaoyan.cn>
     * @date 2022/03/01 15:57
     */
    ServiceResult<Boolean> downUserAccountTemplate(String path, HttpServletResponse response);


    /**
     * 下载当前账号
     *
     * @param accountDTO
     * @return
     * @author 林志剑 <zhijian.lin@idiaoyan.cn>
     * @date 2022/03/01 15:57
     */
    ServiceResult<List<ExportUserAccountDTO>> exportUserData(ListUserAccountDTO accountDTO);

    /**
     * 获取用户详情
     *
     * @param userId:
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 18:26
     */
    ServiceResult<UserDTO> getUserByPrimaryKey(String userId);

    /**
     * 解析文件数据
     *
     * @param orgId
     * @param userDTOList:
     * @param currentId    当前登陆用户id
     * @return key ： userId, value : group ids
     * @throws IOException throwable
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 18:26
     */
    ServiceResult<Void> parseUserData(String orgId, List<ImportUserAccountDTO> userDTOList, String currentId) throws IOException;

    /**
     * 更新用户密码信息
     *
     * @param userId   用户id
     * @param password 密码【密文】
     * @param salt     【盐】
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 10:55
     */
    ServiceResult<Boolean> updateUserPassword(String userId, String password, String salt);


    /**
     * 根据条件查询用户
     *
     * @param userDTO 用户dto
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/4 14:30
     */
    ServiceResult<List<UserDTO>> listByCondition(UserDTO userDTO);

    /**
     * 更新User信息
     *
     * @param userDto
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/8 20:10
     */
    ServiceResult<UserDTO> updateUser(UserDTO userDto);

    /**
     * 发送激活邮件/批量激活
     *
     * @param userIds
     * @param remoteHost
     * @param protocol
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/4 18:58
     */
    ServiceResult<String> activeEmailMany(List<String> userIds, String remoteHost, String protocol);

    /**
     * 发送激活邮件
     *
     * @param user
     * @param organization
     * @param remoteHost
     * @param protocol
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/19 18:56
     */
    ServiceResult<String> sendActiveEmail(UserDTO user, OrganizationDTO organization, String remoteHost, String protocol);

    /**
     * 账号-绑定邮箱-验证邮件
     *
     * @param userId
     * @param token
     * @param email
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/4 23:18
     */
    ServiceResult<String> verificationEmail(String userId, String token, String email);

    /**
     * 根据userId更新用户信息
     *
     * @param userDTO
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/4 14:30
     */
    ServiceResult<Integer> updateById(UserDTO userDTO);

    /**
     * 账户手机邮箱是否重复判断
     *
     * @param orgId  : 公司id
     * @param phone  : 手机
     * @param email  : 邮箱
     * @param userId : 待检查的用户id
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    Boolean checkUserByEmailAndPhone(String orgId, String phone, String email, String userId);


    /**
     * 账户手机或邮箱是否重复判断
     *
     * @param orgId  : 公司id
     * @param phone  : 手机
     * @param email  : 邮箱
     * @param userId : 待检查的用户id
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    ServiceResult<Boolean> checkUserByEmailOrPhone(String orgId, String phone, String email, String userId);

    /**
     * 开放平台创建账号时检查 第三方id在我们系统中是否已存在
     *
     * @param orgId    : 公司id
     * @param silentId : 静默登录id
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    Boolean checkUserBySilentId(String orgId, String silentId);

    /**
     * 检查租户用户限额
     * 注意返回值不会返回false，请不要拿false直接比较
     *
     * @param orgId  公司id
     * @param amount 数量
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/14 17:24
     */
    ServiceResult<Boolean> checkUserQuota(String orgId, Integer amount);


    /**
     * 保存用户 (保存用户表,用户角色表,用户组织表,创建用户mq)
     *
     * @param orgId       公司id
     * @param userDTO     用户参数
     * @param groupIdList 组织id列表
     * @param roleIdList  角色id列表
     * @return java.lang.String
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/14 17:53
     */
    String saveUser(String orgId, UserDTO userDTO, List<String> groupIdList, List<String> roleIdList);

    /**
     * 收到邮件后实际点击激活的页面
     *
     * @param token
     * @param userId
     * @param password
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/4 21:48
     */
    ServiceResult<String> activeEmail(String token, String userId, String password);

    /**
     * 重置密码
     *
     * @param userId   用户id
     * @param password 用户新密码(明文)
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/29 14:55
     */
    ServiceResult<String> resetPassword(String userId, String password);

    /**
     * 账号-绑定手机号-绑定
     *
     * @param currentToken token信息
     * @param userId
     * @param mobile
     * @param vcode
     * @param sceneType
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/6 23:52
     */
    ServiceResult<String> bindMobileNumber(TokenDTO currentToken, String userId, String mobile, String vcode, int sceneType);

    /**
     * 根据手机号和状态查询用户数量
     *
     * @param phone  手机号
     * @param status 用户状态
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/07 17:03
     */
    ServiceResult<Integer> countByPhoneAndStatus(String phone, Integer status);

    /**
     * 根据手机号或unionId、状态查询用户信息
     *
     * @param phone   手机号
     * @param unionId unionId
     * @param status  状态
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.UserDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/07 17:19
     */
    ServiceResult<UserDTO> selectByPhoneOrUnionId(String phone, String unionId, Integer status);

    /**
     * 根据用户id列表查询用户列表
     *
     * @param userIdList 用户id列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/07 18:32
     */
    ServiceResult<List<UserDTO>> selectByIds(List<String> userIdList);

    /**
     * 通过userIds以及其他可选条件联表查询用户信息列表
     *
     * @param roleId  可选条件
     * @param status  可选条件
     * @param userIds 用户id列表
     * @param limit   查询结果限制条数
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 14:12
     */
    ServiceResult<List<UserDO>> listByIds(String roleId, Integer status, List<String> userIds, Integer limit);

    /**
     * 创建用户
     *
     * @param userDTO 用户dto
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/8 21:28
     */
    ServiceResult<String> insert(UserDTO userDTO);

    /**
     * 更新租户用户数消费额
     *
     * @param orgId:  公司id
     * @param amount: 数量
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/2 18:53
     */
    void updateUserConsumption(String orgId, Integer amount);

    /**
     * 查询用户信息列表
     *
     * @param userDTO 相关参数条件
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/09 19:28
     */
    ServiceResult<List<UserDTO>> selectList(UserDTO userDTO);

    /**
     * 根据org_id和user_id判断用户是否有审核者的权限
     *
     * @param orgId  公司id
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/14 13:42
     */
    ServiceResult<Boolean> checkReviewer(String orgId, String userId);

    /**
     * 根据org_id和user_id判断用户是否有审核者的权限
     *
     * @param orgId  公司id
     * @param userId 用户id
     * @return ServiceResult<Boolean>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/6/29 16:53
     */
    ServiceResult<Boolean> checkReviewerPerm(String orgId, String userId);

    /**
     * 根据用户id查询 用户的权限列表
     *
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/14 13:43
     */
    ServiceResult<List<String>> listUserPermissions(String userId);

    /**
     * 根据关键字检索email等其他一些字段
     *
     * @param orgId   公司id
     * @param keyword 关键字
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/16 15:02
     */
    ServiceResult<List<UserDTO>> selectByEmailOrOthers(String orgId, String keyword);

    /**
     * 根据userName、phone、mobile查交集
     *
     * @param userDTO 查询参数
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/15 20:10
     */
    ServiceResult<List<UserDTO>> listUserByOrCondition(UserDTO userDTO);

    /**
     * 更新用户同意协议和是否内部员工 init方法
     *
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    ServiceResult<Boolean> updateAcceptAndInnerUser();

    /**
     * 根据orgId获取或创建bishare的临时用户信息
     *
     * @param orgId 公司id信息
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.UserDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/29 18:00
     */
    ServiceResult<UserDTO> getOrCreateBiShareTempUser(String orgId);

    /**
     * 根据条件查询用户信息
     *
     * @param userDTO
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/29 15:20
     */
    ServiceResult<List<UserDTO>> getUserByCondition(UserDTO userDTO);

    /**
     * 可选条件查询单个用户
     *
     * @param userDTO
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/4 23:07
     */
    ServiceResult<UserDTO> getOneUserByFilter(UserDTO userDTO);

    /**
     * 根据create_time倒序查找
     *
     * @param userDTO
     * @return java.util.List<com.bestcem.xm.user.service.dto.user.UserDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/31 14:06
     */
    List<UserDTO> getUserListByCreateTimeSort(UserDTO userDTO);

    /**
     * 根据邮箱或用户名查用户信息
     *
     * @param orgId    公司id
     * @param username 用户名
     * @param phone    手机号
     * @param email    邮箱
     * @return java.util.List<com.bestcem.xm.user.service.dto.user.UserDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/31 14:06
     */
    List<UserDTO> getUserListByUsernameOrEmailOrPhone(String orgId, String username, String phone, String email);

    /**
     * 重置企业微信
     *
     * @param qyWxOpenUserid 企业微信openUserid
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/31 23:28
     */
    Integer updateUserByQyWxOpenUserid(String qyWxOpenUserid);

    /**
     * 根据条件更新用户
     *
     * @param userDTO
     * @return
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.cn>
     * @date 2022/3/31 19:00
     */
    ServiceResult<Integer> updateByOrgIdSelective(UserDTO userDTO);

    /**
     * 获取组织的用户数
     *
     * @param orgId orgId
     * @return Integer 用户数
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.cn>
     * @date 2022/3/31 19:00
     */
    ServiceResult<Integer> countByOrgId(String orgId);


    /**
     * 获取用户权限集合
     *
     * @param orgId  公司id
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/10 11:39
     */
    ServiceResult<List<String>> getUserPermissionList(String orgId, String userId);

    /**
     * 用户详情
     *
     * @param userId
     * @param orgId
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.UserSelfDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/15 23:42
     */
    ServiceResult<UserSelfDTO> getUserSelf(String userId, String orgId);

    /**
     * 分页获取当前系统管理员和总部层级的用户列表
     *
     * @param pageDto 分页信息
     * @param orgId   公司id信息
     * @param search  关键字
     * @return com.bestcem.xm.util.ServiceResult
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/17 17:22
     */
    ServiceResult<PageResponseDTO<TicketUserDTO>> pageTicketUsers(PageRequestDTO pageDto, String orgId, String search);

    /**
     * 分页获取绑定了组织的账号
     *
     * @param pageParam 分页信息
     * @param orgId     公司id信息
     * @param search    关键字
     * @return com.bestcem.xm.util.ServiceResult
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/17 17:22
     */
    ServiceResult<PageResponseDTO<TicketUserDTO>> pageTicketUsersWithGroup(PageParam pageParam, String orgId, String search);

    /**
     * 根据相关条件查询当前系统管理员和总部层级的用户信息列表
     *
     * @param orgId  公司id信息
     * @param search 关键字
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.TicketUserDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/17 17:44
     */
    ServiceResult<List<TicketUserDTO>> listTicketUsers(String orgId, String search);

    /**
     * 获取可分配给账户的角色列表
     *
     * @param orgId 公司id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.role.UserRoleDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/23 16:34
     */
    ServiceResult<List<UserRoleDTO>> getRoleAccount(String orgId);

    /**
     * 邮箱或手机号查找用户并根据创建时间倒序
     *
     * @param status 用户状态
     * @param email  邮箱
     * @param phone  手机号
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/23 17:43
     */
    ServiceResult<List<UserDTO>> getUserByEmailOrPhone(Integer status, String email, String phone);

    /**
     * 根据搜索条件查询用户列表
     *
     * @param userConditionDTO 用户搜索条件
     * @param statuses         用户状态
     * @param search           登录用户名，用户姓名模糊查询条件
     * @param fields           限定返回字段
     * @return 用户列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 10:38 2022/6/29
     */
    ServiceResult<List<UserDTO>> listUsers(UserConditionDTO userConditionDTO, List<Integer> statuses, String search, List<String> fields);

    /**
     * 用户解绑企业微信信息
     *
     * @param orgId      租户id
     * @param openUserid openuserId
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/29 15:26
     */
    ServiceResult<Void> unbindWechatWork(String orgId, String openUserid);

    /**
     * 用户解绑飞书信息
     *
     * @param orgId  租户id
     * @param openId openId
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/29 15:26
     */
    ServiceResult<Void> unbindFeishu(String orgId, String openId);

    /**
     * 查找新公司所有角色为系统管理员的用户id
     *
     * @param dstOrgId       新公司id
     * @param dstAdminRoleId 新公司系统管理员角色id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/3 18:28
     */
    ServiceResult<List<String>> listByRoleIdJoinUserRole(String dstOrgId, String dstAdminRoleId);

    /**
     * 根据groupLevel和roleId对，查询符合条件的用户列表
     */
    List<UserDO> listUsersByGroupLevelAndRoleId(List<UserConditionLevel> conditionsList, String orgId);

    /**
     * 根据角色Id和组织查询指定状态列表的用户列表
     *
     * @param roleId 角色id
     * @param orgId  组织id
     * @param status 状态列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/07 13:39
     */
    ServiceResult<List<String>> getUserIdsByRoleAndOrgAndStatus(String roleId, String orgId, List<Integer> status);

    /**
     * 根据orgId、email、用户id列表查询用户列表
     *
     * @param orgId   租户id
     * @param email   邮箱
     * @param userIds 用户id列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/07 13:51
     */
    ServiceResult<List<UserDTO>> selectByOrgAndEmailAndUserIds(String orgId, String email, List<String> userIds);

    /**
     * 根据orgId、phone、用户id列表查询用户列表
     *
     * @param orgId   租户id
     * @param phone   管理员手机号
     * @param userIds 用户id列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/07 13:51
     */
    ServiceResult<List<UserDTO>> selectByOrgAndPhonePhoneAndUserIds(String orgId, String phone, List<String> userIds);

    /**
     * 根据用户id列表更新相关用户信息
     *
     * @param userIds 用户id列表
     * @param user    用户信息
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/07 14:00
     */
    ServiceResult<Void> updateByUserIds(List<String> userIds, UserDTO user);

    /**
     * 根据orgId列表更新innerFlag字段
     *
     * @param orgIds    租户id
     * @param innerFlag 内部用户标识
     * @return void
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/13 18:36
     */
    void updateInnerFlagByOrgIds(List<String> orgIds, Integer innerFlag);

    /**
     * 验证码校验
     *
     * @param prefix 验证码存储前缀
     * @param phone  手机号
     * @param vCode  验证码
     * @return 校验结果
     */
    ServiceResult<Boolean> checkVcode(String prefix, String phone, String vCode);

    /**
     * 根据用户名查询用户信息(仅返回userId和userName)
     *
     * @param userNames
     * @param orgId
     * @return ServiceResult<Map < String, String>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/8/2 14:43
     */
    ServiceResult<Map<String, String>> listIdsByUserName(Set<String> userNames, String orgId);

    /**
     * 所有账号列表
     *
     * @param accountDTO: 账号列表搜索数据
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.PageResponseDTO < com.bestcem.xm.user.controller.vo.user.request.UserAccountListVO>>
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 18:26
     */
    ServiceResult<PageUserResponseDTO> getAllUserAccountList(ListUserAccountDTO accountDTO);
}
